
package GUI;

import Logica.ChessTrainer;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.LinkedList;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class ChessCanvas extends JPanel implements MouseListener{

    
    int alto,ancho,altoFila,anchoFila,xSiguiente,ySiguiente,xCanvasSg,yCanvasSg,cont=0,profundidad;
    int [][]posicionesCanvas=new int[16][2];
    String [] letras={"a","b","c","d","e","f"},numeros={"6","5","4","3","2","1"};
    LinkedList<InterfaceFichas> fichas = new LinkedList<InterfaceFichas>();
    InterfaceFichas fichaSeleccionada = null;
    Image imgBuff;
    InterfaceFichas fichaComida = null;
    Graphics grafBuff;
    ChessTrainer chess= new ChessTrainer();
    Thread movimiento;
    String registro = "";
    JTextArea log;
    int [][] prueba;
    boolean mover=false,mueveNegro=false;
    ArrayList<int[]> movimientos;
    
    public ChessCanvas(){
        setBackground(Color.white);
        addMouseListener(this);
        log = new JTextArea();
        log.setEditable(false);
        log.append("-----MOVIMIENTOS------");
    }
    
    @Override
    public void paint(Graphics g){
        update(g);
    }
    
    @Override
    public void update(Graphics g){
        
        Dimension d= getSize();
        ancho = d.width;
        alto = d.height;
        altoFila = alto/6;
        anchoFila = ancho/6;
        if(grafBuff==null){
            imgBuff = createImage(ancho,alto);
            grafBuff = imgBuff.getGraphics();
        }
        grafBuff.setColor(getBackground());
        grafBuff.fillRect(0, 0, ancho, alto);
        pintarTablero(grafBuff);
        for (InterfaceFichas ficha : fichas) {
            if(ficha.getX()!=-1&&ficha.getY()!=-1){
                ficha.pintar(grafBuff, this);
            }
            
        }
        g.drawImage(imgBuff, 0, 0, this);
    }
    
    public void añadirFicha(InterfaceFichas ficha){
        fichas.add(ficha);
    }
    
    public void quitarFicha(InterfaceFichas ficha){
        fichas.remove(ficha);
    }
    
    public InterfaceFichas escogerFicha(MouseEvent e){
        for(InterfaceFichas ficha: fichas){
            if(ficha.estaDentro(e.getX(), e.getY())){
                return ficha;
            }
        }
        return null;
    }
    
    public InterfaceFichas escogerFicha(int x,int y){
        for(InterfaceFichas ficha: fichas){
            if(ficha.getX()==x&&ficha.getY()==y){
                return ficha;
            }
        }
        return null;
    }
    
    public JTextArea getRegistro(){
        return this.log;
    }
    
    public void setRegistro(String log){
        this.log.append(log);
        this.log.validate();
    }
    
    public void setProfundidad(int profundidad){
        this.profundidad=profundidad;
    }
    
    public ArrayList<int[]> movimientosValidos(InterfaceFichas fichaMovida){
        ArrayList<int []> resultado = fichaMovida.posiblesMovimientos();
        for (int i = 0; i < resultado.size(); i++) {
            int actual[]=resultado.get(i);
            for(InterfaceFichas ficha: fichas){
                
                if(fichaMovida.getTipo().equals("Peon")){
                    if(i==0){
                        
                    }
                }else 
                if(((ficha.getX()==actual[0])&&(ficha.getY()==actual[1]))){
                    
                    if(ficha.getColor().equals(fichaMovida.getColor())){
                       resultado.remove(actual); 
                    }
                    
                        
                }
            }
        }
        
        return resultado;
    }
    
    public void pintarTablero(Graphics g){
        
        for(int i=0;i<6;i++){
            for(int j=0;j<6;j++){
                    if((i+j)%2==0){
                        g.setColor(Color.white);
                        g.fillRect((ancho)-(6-j)*anchoFila,(alto)-(6-i)*altoFila,anchoFila,altoFila);
                    }else{
                        g.setColor(Color.DARK_GRAY);
                        g.fillRect((ancho)-(6-j)*anchoFila,(alto)-(6-i)*altoFila,anchoFila,altoFila);
                    }
                }
            }
    }
    
    public void ImprimirMatriz(ArrayList<int[]> matriz)
    {
        for (int i = 0; i < matriz.size(); i++) {
            int actual[]=matriz.get(i);
            for (int j = 0; j < actual.length; j++) {

                System.out.print(actual[j]+" ");
            }
            System.out.println();
        }
    }
    
    public void mostrarMovimientos(ArrayList<int[]> movimientos){
        Graphics g=this.getGraphics();
        g.setColor(Color.red);
        
        for (int i = 0; i < movimientos.size(); i++) {
            int actual[]=movimientos.get(i);
                g.drawRect((ancho)-(6-actual[1])*anchoFila,(alto)-(6-actual[0])*altoFila,anchoFila,altoFila);
                
        }
    }
    
    public void limpiarRegistro(){
        log.setText("");
        log.setEditable(false);
        log.append("-----MOVIMIENTOS------");
        log.validate();
    }
    
    public boolean Contiene(ArrayList<int[]> lista,int pos[]){
        boolean contiene=false;
        for (int i = 0; i < lista.size(); i++) {
            int object[] = lista.get(i);
            if(object[0]==pos[0]&&object[1]==pos[1])
            {
                contiene=true;
                break;
            }
            
        }
        return contiene;
    }
    
    public void juegaBlancas(){
        int [] movimientoBlanca = chess.Jugar(profundidad);
        System.out.println(movimientoBlanca[0]+" "+movimientoBlanca[1]+" "+movimientoBlanca[2]);
        fichaSeleccionada=fichas.get(movimientoBlanca[0]);
        fichaComida = escogerFicha(movimientoBlanca[1],movimientoBlanca[2]);
        if(fichaComida!=null){
            fichaComida.setPosicion(-1,-1);
        }
        fichaSeleccionada.setPosicion(movimientoBlanca[1],movimientoBlanca[2]);
        String jugada="\nJuega "+fichaSeleccionada.getColor()+":\n"+fichaSeleccionada.getTipo()+" "+letras[movimientoBlanca[2]]+" - "+numeros[movimientoBlanca[1]];
        System.out.println(jugada);
        setRegistro(jugada);
        repaint();
        chess.Movimiento(movimientoBlanca);
        mueveNegro=true;
        cont=0;
        
    }
    
    public void nuevoJuego(){
        limpiarRegistro();
        prueba=null;
        fichas=null;
        chess=null;
        chess= new ChessTrainer();
        fichas = new LinkedList<InterfaceFichas>();
        prueba=chess.getPosiciones();
        añadirFicha(new Ficha(prueba[0][0],prueba[0][1],"Blanco","Peon"));
        añadirFicha(new Ficha(prueba[1][0],prueba[1][1],"Negro","Peon"));
        añadirFicha(new Ficha(prueba[2][0],prueba[2][1],"Blanco","Peon"));
        añadirFicha(new Ficha(prueba[3][0],prueba[3][1],"Negro","Peon"));
        añadirFicha(new Ficha(prueba[4][0],prueba[4][1],"Blanco","Peon"));
        añadirFicha(new Ficha(prueba[5][0],prueba[5][1],"Negro","Peon"));
        añadirFicha(new Ficha(prueba[6][0],prueba[6][1],"Blanco","Peon"));
        añadirFicha(new Ficha(prueba[7][0],prueba[7][1],"Negro","Peon"));
        añadirFicha(new Ficha(prueba[8][0],prueba[8][1],"Blanco","Alfil"));
        añadirFicha(new Ficha(prueba[9][0],prueba[9][1],"Negro","Alfil"));
        añadirFicha(new Ficha(prueba[10][0],prueba[10][1],"Blanco","Caballo"));
        añadirFicha(new Ficha(prueba[11][0],prueba[11][1],"Negro","Caballo"));
        añadirFicha(new Ficha(prueba[12][0],prueba[12][1],"Blanco","Reina"));
        añadirFicha(new Ficha(prueba[13][0],prueba[13][1],"Negro","Reina"));
        añadirFicha(new Ficha(prueba[14][0],prueba[14][1],"Blanco","Rey"));
        añadirFicha(new Ficha(prueba[15][0],prueba[15][1],"Negro","Rey"));
        repaint();
    }
    
//    public void iniciarMovimiento(int x,int y){
//        this.xSiguiente=x;
//        this.ySiguiente=y;
//        
//        if(movimiento==null){
//            movimiento= new Thread(this);
//            movimiento.start();
//        }
//    }
//    
//    public void detenerMovimiento(){
//        if(movimiento!=null){
//            movimiento.interrupt();
//            movimiento=null;
//        }
//    }
//    
//    public void mover(){
//        int xCanvasAnt=fichaSeleccionada.getXcanvas(),yCanvasAnt=fichaSeleccionada.getYcanvas();
//            if(fichaSeleccionada.getX()<xSiguiente&&fichaSeleccionada.getY()<ySiguiente){
//                xCanvasSg=(alto)-(6-xSiguiente)*altoFila;
//                yCanvasSg=(ancho)-(6-ySiguiente)*anchoFila;
//                fichaSeleccionada.setPosicionCanvas(xCanvasAnt++,yCanvasAnt++);
//            }
//    }
//    
//    @Override
//    public void run() {
//        while(fichaSeleccionada.getXcanvas()!=xCanvasSg&&fichaSeleccionada.getYcanvas()!=yCanvasSg){
//            mover();
//            try {
//                            Thread.sleep(8);
//                            repaint();
//                        } catch (InterruptedException ex) {
//                            System.out.println("Error en run()");
//                        }
//        }
//        fichaSeleccionada.setPosicion(xSiguiente,ySiguiente);
//    }

    @Override
    public void mouseClicked(MouseEvent e) {
                if(cont==0){
                    fichaSeleccionada = escogerFicha(e);
                    if(fichaSeleccionada!=null){
                        if(fichaSeleccionada.getColor().equals("Negro")){

                        System.out.println("Ficha: "+fichaSeleccionada.getTipo()+" Color: "+fichaSeleccionada.getColor());
                        movimientos=chess.posiblesMovimientos(new int[]{fichaSeleccionada.getX(),fichaSeleccionada.getY()});

                        if(movimientos!=null){
                            cont=1;
                            mostrarMovimientos(movimientos);
                        }
                        else{
                            System.out.println("retorno null");
                        }
                        }

                        }else{
                            repaint();
                        }
                    }
                    else if(cont==1){
                            int i=(e.getY()-(ancho-3))/anchoFila+5,j=(e.getX()-(alto-3))/altoFila+5;
                            if(Contiene(movimientos,new int[]{i,j})){
                                fichaComida= escogerFicha(e);
                                if(fichaComida!=null){
                                    fichaComida.setPosicion(-1,-1);
                                }
                                fichaSeleccionada.setPosicion(i,j);
                                chess.Movimiento(new int[]{fichas.indexOf(fichaSeleccionada),i,j});
                                String jugada="\nJuega "+fichaSeleccionada.getColor()+":\n"+fichaSeleccionada.getTipo()+" "+letras[j]+" - "+numeros[i];
                                setRegistro(jugada);
                                repaint();
                                cont=0;
                                juegaBlancas();


                            }else{
                                cont=0;
                                repaint();
                            }
                    }
            
        
    }

    @Override
    public void mousePressed(MouseEvent e) {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
        
    }
    
}
